package cn.com.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * Hello world!
 *
 */
public class JMSProducer 
{
	
	private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; 
	private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; 
	private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; 
	
    public static void main( String[] args ) throws JMSException
    {
    	ConnectionFactory connectionFactory; // 消息中间件的连接工厂
    	Connection connection = null; // 消息连接
    	Session session = null; // 创建会话
    	
    	connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKERURL);
    	try {
			connection = connectionFactory.createConnection();
			
			// 要先启动链接才能创建会话
			connection.start();
			/**
			 * createSession(paramA,paramB); 
			 * paramA是设置事务的，paramB设置acknowledgment mode 
			 * paramA设置为false时：paramB的值可为Session.AUTO_ACKNOWLEDGE，Session.CLIENT_ACKNOWLEDGE，DUPS_OK_ACKNOWLEDGE其中一个。 
			 * paramA设置为true时：paramB的值忽略， acknowledgment mode被jms服务器设置为SESSION_TRANSACTED 。 
			 * Session.AUTO_ACKNOWLEDGE为自动确认，客户端发送和接收消息不需要做额外的工作。 
			 * Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后，必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。 
			 * DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回，会话对象就会确认消息的接收；而且允许重复确认。在需要考虑资源使用时，这种模式非常有效。
			 */
			// 创建session，进行消息的发送
			session = connection.createSession(Boolean.TRUE, Session.SESSION_TRANSACTED);
			
			// 创建消息队列
			Queue queue = session.createQueue("talk2consumer");
			
			// 创建消息生产者
			MessageProducer messageProducer = session.createProducer(queue);
			
			// 模拟发送消息
			for (int i = 0; i < 5; i++) {
				TextMessage textMessage = session.createTextMessage("给消费者发送的消息"+i);
				messageProducer.send(textMessage);
			}
			// 启动事务必须要commit
			session.commit();
		} catch (JMSException e) {
			// 失败要rollback
			session.rollback();
			e.printStackTrace();
		} finally {
			if (connection != null) {
				connection.close();
			}
			if (session != null) {
				session.close();
			}
		}
    }
}
